package apresentacao;

import negocio.Jogador;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.Timer;
import negocio.Animado;
import negocio.Jogo;
import negocio.Personagem;

/*
 * Painel do meio onde o jogo acontece
 */
public class Canvas extends JPanel implements ActionListener {
    Jogo jogo;
    private Timer timer;
    private Main pai;

    public Canvas(Main p) {
        // salva a referência ao pai para poder acessar outros elementos da janela
        // tal como o score...
        this.pai = p;
        // trata eventos das teclas pressionadas
        this.addKeyListener(new TratadorEventoTeclado());
        this.setFocusable(true); // assume foco para receber os comandos
        this.setBackground(Color.BLACK); // altera a cor de fundo para preto
        this.setDoubleBuffered(true); // tornando o redesenho mais rapido
        // atualiza a tela a cada 25 milisegundos
        this.timer = new Timer(25, this);
        this.timer.start();
    }

    /*
     * Inicia uma nova partida
     */
    public void novoJogo() {
        // instancia um novo objeto jogo caso não houver nenhum ainda instanciado
        if (jogo == null) jogo = new Jogo(this.getWidth(), this.getHeight());

        // cria uma nova partida;
        jogo.novaRodada();
        //jogador = jogo.getJogador();
    }

    /*
     * Pinta todos os elementos do painel
     */
    @Override
    public void paint(Graphics g) {
        super.paint(g);

        if (jogo == null) return;
        Graphics2D g2d = (Graphics2D) g;
        switch (jogo.getStatus()) {
            case 0:
            case 1:  // desenha todos os elementos do jogo
                Personagem umPersonagem;
                for (int i = 0; i < jogo.listaDeAnimados.size(); i++){
                    umPersonagem = (Personagem) jogo.getAnimados().get(i);
                    g2d.drawImage(umPersonagem.getImagem(), umPersonagem.getPosx(),umPersonagem.getPosy(),this);
                }
                
                /*
                if (jogador != null) {
                    g2d.drawImage(jogador.getImagem(), jogador.getX(), jogador.getY(), this);
                }
                if (inimigo != null) {
                    g2d.drawImage(inimigo.getImagem(), inimigo.getX(), inimigo.getY(), this);
                }*/
                break;
            case 2:  // mostra tela de final de jogo
                // ativa o antialiasing
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                // modifica a fonte
                Font small = new Font("Helvetica", Font.BOLD, 14);
                FontMetrics metr = this.getFontMetrics(small);
                g2d.setColor(Color.white);
                g2d.setFont(small);
                String msg = "Game Over!";
                g2d.drawString(msg,
                        (getWidth() - metr.stringWidth(msg)) / 2, getHeight() / 2);
                break;
        }
        // atualiza o placar
        //if (jogador != null) pai.jLPontos.setText("" + jogador.getPontuacao());
    }

    /*
     * É chamado pelo Timer a toda hora para realizar a jogada e redesenhar a
     * tela
     */
    public void actionPerformed(ActionEvent e) {
        if (jogo == null) return;
        jogo.realizaJogada();
        repaint();
    }

    /*
     * Classe para tratamento dos eventos do teclado Toda vez que alguém
     * utilizar o teclado ela executará o método correspondente ao evento
     * ocorrido: tecla pressionada ou levantada
     */
    private class TratadorEventoTeclado extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {   // tecla pressionada
            if (jogo.getJogador() != null) jogo.getJogador().teclaPressionada(e);
        }

        @Override
        public void keyReleased(KeyEvent e) {  // tecla levantada
            if (jogo.getJogador() != null) jogo.getJogador().teclaSolta(e);
        }
    }
}
